home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / term / term_47a_pch.lha / Source / gtlayout-38.3 / LTP_DefaultEditRoutine.c < prev    next >
C/C++ Source or Header  |  1996-11-10  |  3KB  |  152 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. ULONG SAVE_DS ASM
  15. LTP_DefaultEditRoutine(REG(a0) struct Hook *Hook,REG(a2) struct SGWork *Work,REG(a1) Msg msg)
  16. {
  17.     struct Hook *Validate;
  18.     LayoutHandle *Handle;
  19.     ObjectNode *Node;
  20.     BOOL Reject;
  21.  
  22.     if(!GETOBJECT(Work->Gadget,Node))
  23.         return(TRUE);
  24.  
  25.     switch(msg->MethodID)
  26.     {
  27.         case SGH_KEY:
  28.  
  29.             Handle = Hook->h_Data;
  30.  
  31.             if(Work->IEvent->ie_Code == 0x5F && Handle->HelpHook)
  32.             {
  33.                 Work->Code        = 0x5F;
  34.                 Work->Actions    = (Work->Actions & ~SGA_BEEP) | SGA_END | SGA_USE;
  35.  
  36.                 LTP_AddHistory(Work);
  37.                 break;
  38.             }
  39.  
  40.             if(Work->IEvent->ie_Code == CURSORUP || Work->IEvent->ie_Code == CURSORDOWN)
  41.                 LTP_HandleHistory(Work);
  42.  
  43.             if(Work->EditOp == EO_ENTER)
  44.             {
  45.                 BOOL Activate = TRUE;
  46.  
  47.                 DB(kprintf("enter operation\n"));
  48.  
  49.                 if(Node->Type == STRING_KIND)
  50.                 {
  51.                     if(Node->Special.String.LastGadget)
  52.                         Activate = FALSE;
  53.                 }
  54. #ifndef DO_HEXHOOK
  55.                 else
  56.                 {
  57.                     if(Node->Type == INTEGER_KIND)
  58.                     {
  59.                         if(Node->Special.Integer.LastGadget)
  60.                             Activate = FALSE;
  61.                     }
  62.                 }
  63. #endif
  64.  
  65.                 if(!(Work->IEvent->ie_Qualifier & QUALIFIER_SHIFT))
  66.                 {
  67.                     DB(kprintf("no shift\n"));
  68.  
  69.                     if(Activate && Handle->AutoActivate)
  70.                         Work->Actions |= SGA_NEXTACTIVE;
  71.  
  72.                     if(!(Work->Actions & SGA_NEXTACTIVE))
  73.                         Work->Code = '\r';
  74.                 }
  75.                 else
  76.                     DB(kprintf("has shift\n"));
  77.             }
  78.  
  79.             Reject = FALSE;
  80.  
  81.             if(Node->Type == FRACTION_KIND && (Work->EditOp == EO_INSERTCHAR || Work->EditOp == EO_REPLACECHAR))
  82.             {
  83.                 LONG DecimalPoint = (LTP_Locale ? LTP_Locale->loc_DecimalPoint[0] : '.');
  84.  
  85.                 if(Work->Code == DecimalPoint || Work->Code == '.' || (Work->Code >= '0' && Work->Code <= '9'))
  86.                 {
  87.                     if(Work->Code == DecimalPoint || Work->Code == '.')
  88.                     {
  89.                         LONG i;
  90.  
  91.                         for(i = 0 ; i < Work->NumChars ; i++)
  92.                         {
  93.                             if(Work->PrevBuffer[i] == DecimalPoint)
  94.                             {
  95.                                 Reject = TRUE;
  96.                                 break;
  97.                             }
  98.                         }
  99.                     }
  100.                 }
  101.                 else
  102.                     Reject = TRUE;
  103.  
  104.                 if(!Reject && Work->Code == '.' && Work->Code != DecimalPoint)
  105.                 {
  106.                     LONG i;
  107.  
  108.                     for(i = 0 ; i < Work->NumChars ; i++)
  109.                     {
  110.                         if(Work->WorkBuffer[i] == '.')
  111.                         {
  112.                             Work->WorkBuffer[i] = DecimalPoint;
  113.                             break;
  114.                         }
  115.                     }
  116.                 }
  117.             }
  118.  
  119.             if(Node->Type == INTEGER_KIND)
  120.                 Validate = Node->Special.Integer.ValidateHook;
  121.             else
  122.                 Validate = Node->Special.String.ValidateHook;
  123.  
  124.             if(Validate)
  125.             {
  126.                 if(!CallHookPkt(Validate,Work,msg))
  127.                     Reject = TRUE;
  128.             }
  129.  
  130.             if(Reject)
  131.             {
  132.                 Work->EditOp    = EO_BADFORMAT;
  133.                 Work->Actions    = SGA_BEEP;
  134.             }
  135.  
  136.             if(Work->Actions & SGA_END)
  137.                 LTP_AddHistory(Work);
  138.  
  139.             /* Falls through to... */
  140.  
  141.         case SGH_CLICK:
  142.  
  143.             break;
  144.  
  145.         default:
  146.  
  147.             return(FALSE);
  148.     }
  149.  
  150.     return(TRUE);
  151. }
  152.